package collection;

import org.junit.Test;

import java.util.*;

/**
 * @description: Collection测试类
 * @author: apple
 * @date:  2021/12/12 4:05 下午
 * @version 1.0
 **/
public class CollectionTest {

    @Test
    public void test1() {

        /*
        * true
        true
        equals方法被调用了！
        equals方法被调用了！
        equals方法被调用了！
        true
        * */


        Collection coll = new ArrayList();
        coll.add(123); // 装箱
        coll.add(456);
        Person p = new Person("Jerry", 20);
        coll.add(p);
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(456);


        boolean contains = coll.contains(123);
        System.out.println(contains); // true
        // 判断的是内容，调用的是equals方法，但String重写了equals方法，所以为true
        System.out.println(coll.contains(new String("Tom"))); // true
//        System.out.println(coll.contains(p)); // true
        // 也是调用的equals方法，但Person类没重写equals方法，所以调用的是object的，但object里面又是写的==，所以为false
        // Person类重写了equals方法就为true了
        System.out.println(coll.contains(new Person("Jerry", 20))); // true


    }

    @Test
    public void test2() {
        Collection coll1 = new ArrayList();
        coll1.add(123); // 装箱
        coll1.add(456);
        coll1.add("abc");

        // 和顺序无关
        Collection coll2 = Arrays.asList(123, "abc" ,456);

        System.out.println(coll1.containsAll(coll2));
    }

    @Test
    public void test3() {
        Collection coll1 = new ArrayList();
        coll1.add(123); // 装箱
        coll1.add(456);
        coll1.add(new Person("Tom",20));
        coll1.add(7); // 装箱
        coll1.add(10);

        coll1.remove(123); // 会调用equals方法
        coll1.remove(new Person("Tom",20)); // 调用equals方法
        System.out.println(coll1);

        Collection coll2 = Arrays.asList(7,10);

        coll1.removeAll(coll2); // 也会调equals方法
        System.out.println(coll1);

        coll1.clear();//清除所有
    }

    @Test
    public void test4() {
        Collection coll1 = new ArrayList();
        coll1.add(123); // 装箱
        coll1.add(456);
        coll1.add(new Person("Tom", 20));

        // 交集部分
        System.out.println(coll1.retainAll(Arrays.asList(123, 456)));
        System.out.println(coll1);
    }

    @Test
    public void test5() {
        Collection coll1 = new ArrayList();
        coll1.add(123); // 装箱
        coll1.add(456);
        coll1.add(new Person("Tom", 20));

        Collection coll2 = new ArrayList();
        coll2.add(123); // 装箱
        coll2.add(456);
        coll2.add(new Person("Tom", 20));

        // 添加元素的位置必须是一致的
        System.out.println(coll1.equals(coll2));

    }
    @Test
    public void test6() {
        Collection coll1 = new ArrayList();
        coll1.add(123); // 装箱
        coll1.add(456);

        // 集合转数组
        Object[] objects = coll1.toArray();
        System.out.println(Arrays.toString(objects));
        // 数组转集合
        Collection coll2 = Arrays.asList(new String[]{"abc", "def"});
        System.out.println(coll2);
        System.out.println(coll2.size());

        // 小心操作
        List<int[]> ints = Arrays.asList(new int[]{1,2,3});
        System.out.println(ints.size());



    }
}

class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        System.out.println("equals方法被调用了！");
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

//    @Override
//    public int hashCode() {
//        return Objects.hash(name, age);
//    }
}
